package com.hualian.ticket.controller;

import com.hualian.ticket.exception.BusinessException;
import com.hualian.ticket.util.JsonResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.UUID;

/**
 * @author 陈静
 * @date 2020/10/20 9:55
 */
@RestController
@RequestMapping("/upload")
public class UploadController {

        //判断文件大小是否符合要求
//        file.length() 字节数
//        file.getSize() 文件字节大小
        //后缀必须是：png/ jpg/jpeg/gif

        //通过UUID生成文件名，+原后缀 组成新的文件名
//        String newFileName = null;
        //在springboot项目中，如何把上传的文件保存在指定的位置中
        //目标路径：/img/fileName
        //真实路径：/usr/upload/img
        //在目标路径和真实路径之间进行关联映射(ResourceHandlerRegistry )
        //返回给前端

        //    @RequestMapping(value = "/upload",method = RequestMethod.POST)
        // 通过MultipartFile对象接收前端传递的图像数据,基于layui只能用file获取目标参数名(默认,不能修改)

        //HttpServletRequest为了获取Context,从而获取"/"真实路径
        @PostMapping(name = "/uploadImg")
        public Map<String,Object> upload(@RequestParam("file") MultipartFile multipartFile, HttpServletRequest request) throws IOException, BusinessException {
            //QQ截图20200724153059.png
            if (multipartFile.isEmpty()) {
                throw new BusinessException("空文件不能上传");
            }
            // 判断文件大小是否符合要求（不能超过1M）
            // file.length()  字节数
            // file.getSize(); 文件字节大小
            long size = multipartFile.getSize();
            if (size > 1024 * 1024) {
                throw new BusinessException("图片大小不能超过1M");
            }
            //检查是否是图片
            BufferedImage bi = ImageIO.read(multipartFile.getInputStream());
            if (bi == null) {
                throw new BusinessException("上传的文件不是图片");
            }

            String originalFilename = multipartFile.getOriginalFilename();
            System.out.println("originalFilename:"+originalFilename); // 输出原文件名
            // 从原始文件名中获取后缀,作为新添加的文件的文件名后缀(匹配)
            String subfix = originalFilename.substring(originalFilename.indexOf(".")+1);
            System.out.println("subfix:"+subfix); // 输出文件后缀（png/jpg/gif/bmp）
            //使用UUID作为文件名,保证服务器中存放的文件名唯一

            String targetFile = UUID.randomUUID().toString().replace("-","")+"."+subfix;
            System.out.println("targetFile:"+targetFile);

            // 通过request获取当前程序的根路径"/"
            String path = request.getServletContext().getRealPath("/");
//            String fileName = "/usr/upload/img/"+targetFile;
            String fileName = path+"uploadImg/"+targetFile;
            System.out.println("fileName:"+fileName); // 输出文件完整地址

            // 构建文件对象
            File uploadFile = new File(fileName);
            //核心操作(含有异常操作, 利用异常设定状态码(和前端约定)
            // 此处应当和ExceptionController结合, 当try执行成功则设定状态码0
            // 出现异常则设定其他
            // 再将异常信息结合BusinessException抛出, 交给ExceptionController处理
            try {
                multipartFile.transferTo(uploadFile);
            } catch (IOException e) {
                //e.printStackTrace();
                throw e;
            }

            JsonResult jsonResult = new JsonResult();

            // 返回状态:0 表示上传成功
            jsonResult.setCode("1");
            // 返回服务器保存后的文件名
            jsonResult.put("fileName",targetFile);
            return jsonResult.getValues();
        }

}
